/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "gpio.h"

/* USER CODE BEGIN 0 */

static void gpio_cfg(GPIO_TypeDef *GPIOx, uint32_t PinMask,uint32_t PinMode,uint32_t PinSpeed,uint32_t PinOutputType,uint32_t Pull)
{
	LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = PinMask;
	GPIO_InitStruct.Mode = PinMode;
	GPIO_InitStruct.Speed = PinSpeed;
	GPIO_InitStruct.OutputType = PinOutputType;
	GPIO_InitStruct.Pull = Pull;
	LL_GPIO_Init(GPIOx, &GPIO_InitStruct);	
}

void bm_set_gpio_input(GPIO_TypeDef *GPIOx, uint32_t PinMask,uint32_t PinOutputType,uint32_t pull)
{
	gpio_cfg(GPIOx,PinMask,LL_GPIO_MODE_INPUT,LL_GPIO_SPEED_FREQ_LOW,PinOutputType,pull);
}

void bm_set_gpio_output(GPIO_TypeDef *GPIOx, uint32_t PinMask,uint32_t PinOutputType,uint32_t pull)
{
	gpio_cfg(GPIOx,PinMask,LL_GPIO_MODE_OUTPUT,LL_GPIO_SPEED_FREQ_LOW,PinOutputType,pull);
}

void bm_set_gpio_an(GPIO_TypeDef *GPIOx, uint32_t PinMask,uint32_t PinOutputType,uint32_t  pull)
{
	gpio_cfg(GPIOx,PinMask,LL_GPIO_MODE_ANALOG,LL_GPIO_SPEED_FREQ_LOW,PinOutputType,pull);
}

void bm_gpio_pin_set(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{
	LL_GPIO_SetOutputPin(GPIOx, PinMask);
}

void bm_gpio_pin_clear(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{
	LL_GPIO_ResetOutputPin(GPIOx, PinMask);
}

uint8_t bm_gpio_pin_read(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{
	//return LL_GPIO_IsInputPinSet(GPIOx,PinMask);
	return LL_GPIO_IsInputPinSet(GPIOx,PinMask);
}

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
        * Free pins are configured automatically as Analog (this feature is enabled through
        * the Code Generation settings)
*/
void MX_GPIO_Init(void)
{

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);

  /**/
  LL_GPIO_ResetOutputPin(GPIOC, MC_POWER_EN_Pin|GNSS_STANDBY_Pin|MC_POWER_LATCH_EN_Pin);

  /**/
  LL_GPIO_ResetOutputPin(GPIOB, LED1_Pin|ELOCKB_Pin|ELOCKA_Pin);

  /**/
  LL_GPIO_SetOutputPin(GNSS_POWER_GPIO_Port, GNSS_POWER_Pin);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15|LL_GPIO_PIN_0
                          |LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_4;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = ELOCKFB_Pin|WHEETURNFB_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_1|LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6
                          |LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_11|LL_GPIO_PIN_12
                          |LL_GPIO_PIN_15;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = MC_POWER_EN_Pin|GNSS_STANDBY_Pin|GNSS_POWER_Pin|MC_POWER_LATCH_EN_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_13
                          |LL_GPIO_PIN_14|LL_GPIO_PIN_15|LL_GPIO_PIN_3|LL_GPIO_PIN_6
                          |LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /**/
  GPIO_InitStruct.Pin = LED1_Pin|ELOCKB_Pin|ELOCKA_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
